package br.com.pi.SmartFast.controler;

import br.com.pi.SmartFast.model.FechamentoMesaDAO;
import br.com.pi.SmartFast.model.Fechamento_Mesa;
import br.com.pi.SmartFast.model.Forma_Pagamento;
import br.com.pi.SmartFast.model.FormatoDeNumeros;
import br.com.pi.SmartFast.model.Mesa;
import br.com.pi.SmartFast.model.Pedidos;
import br.com.pi.SmartFast.model.PedidosDAO;
import java.sql.ResultSet;
import javax.swing.DefaultListModel;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JOptionPane;
import javax.swing.JTextField;

/**
 *
 * @author Alessandro
 */
public class ControleTelaCaixa implements Runnable {

    private JList lista_mesa;
    private JComboBox forma_pagamento;
    private JFrame tela;
    private JLabel total_mesa;
    JTextField txt_pgto, troco;
    private PedidosDAO dao = new PedidosDAO();
    DefaultListModel produtos = new DefaultListModel();
    private float total_conta = 0;

    public ControleTelaCaixa(JList lista_mesa, JComboBox forma_pagamento, JFrame tela, JLabel total,
            JTextField pgto, JTextField troco) {
        this.lista_mesa = lista_mesa;
        this.forma_pagamento = forma_pagamento;
        this.tela = tela;
        this.total_mesa = total;
        this.txt_pgto = pgto;
        this.troco = troco;
    }

    public void telaAoabrir() {
        try {
            this.getformaPagamento();
            Thread t1 = new Thread(this);
            t1.start();
            t1.setPriority(10);

        } catch (Exception e) {
            System.out.println(e);
        }
    }

    public void listaMesasDuploClique(int clique) {
        try {
            if (clique == 2) {
                this.getTotalPagar();
            }
        } catch (Exception e) {
        }
    }

    public void run() {
        try {
            while (true) {
                this.getPesquisaContasAFechar();
                Thread.sleep(10000);
            }
        } catch (Exception e) {
        }

    }

    public void textoDinheiroAoclicar() {
        try {
            this.getTroco();
        } catch (Exception e) {
        }
    }

    public void botaoFecharConta() {
        try {
            this.setFecharConta();
            
            this.getPesquisaContasAFechar();
            
            JOptionPane.showMessageDialog(null, "Pedido Fechado", "Fechar Pedidos", JOptionPane.INFORMATION_MESSAGE);

            this.troco.setText(null);
            this.txt_pgto.setText(null);
            this.total_mesa.setText(new FormatoDeNumeros(0.0).getValorMonetario());

        } catch (Exception e) {
            
        }
    }

    private void setFecharConta() throws Exception {

        Mesa ms = new Mesa();
        Fechamento_Mesa fm = new Fechamento_Mesa();
        Forma_Pagamento fp = new Forma_Pagamento();
        FechamentoMesaDAO mdao = new FechamentoMesaDAO();
        int cod_mesa = Integer.parseInt(this.lista_mesa.getSelectedValue().toString().substring(7));

        ms.setCod_mesa(cod_mesa);
        fp.setCod_Forma_Pagamento(this.getCodFormaPagamento(this.forma_pagamento.getSelectedItem().toString()));
        fm.setForma_Pagamento(fp);
        fm.setMesa(ms);
        fm.setValor_pago(this.total_conta);

        mdao.gravaProduto(fm);

        Pedidos ped = new Pedidos();
        PedidosDAO pdao = new PedidosDAO();
        ped.setProd_pago(true);
        ped.setMesa(ms);
        pdao.setPedidoPago(ped);

    }

    private void getPesquisaContasAFechar() throws Exception {

        this.produtos.clear();
        this.lista_mesa.removeAll();
        String sql = "select distinct fk_mesa as mesa from pedidos where "
                + " pedido_fechado is true and prod_pago is false";

        ResultSet rs = dao.getDadosTabela(sql);

        if (rs.next()) {
            do {
                produtos.addElement("MESA : " + rs.getInt("mesa"));
            } while (rs.next());
            this.lista_mesa.setModel(produtos);
        }
    }

    private void getformaPagamento() throws Exception {

        String sql = "select descricao from forma_pagamento";

        ResultSet rs = dao.getDadosTabela(sql);

        if (rs.next()) {
            this.forma_pagamento.removeAllItems();
            do {
                this.forma_pagamento.addItem(rs.getString("descricao"));
            } while (rs.next());
        }

    }

    private void getTotalPagar() throws Exception {

        if (this.lista_mesa.isSelectedIndex(this.lista_mesa.getSelectedIndex())) {
            StringBuilder sql = new StringBuilder();
            sql.append("select sum(quantidade_prod * custo_produto)as soma from ");
            sql.append("pedidos where fk_mesa = '"+ this.lista_mesa.getSelectedValue().toString().substring(7) +"' ");
            sql.append("and prod_pago is false");

            ResultSet rs = dao.getDadosTabela(sql.toString());

            if (rs.next()) {
                this.total_conta = rs.getFloat("soma");
                this.total_mesa.setText(new FormatoDeNumeros(rs.getFloat("soma")).getValorMonetario());
            } else {
                this.total_mesa.setText(new FormatoDeNumeros(0).getValorMonetario());
            }
        } else {
            JOptionPane.showMessageDialog(null, "Selecione uma mesa da lista!!", "fechamento de Pedidos", JOptionPane.ERROR_MESSAGE);
        }
    }

    private void getTroco() throws Exception {

        if (!this.txt_pgto.getText().equalsIgnoreCase("")) {
            float pgto = Float.parseFloat(this.txt_pgto.getText());
            float troco1 = pgto - this.total_conta;

            this.troco.setText(Float.toString(troco1));
        }
    }

    private Integer getCodFormaPagamento(String forma) throws Exception {

        String sql = "select id_forma_pagamento as forma from forma_pagamento where descricao like '" + forma + "'";

        ResultSet rs = dao.getDadosTabela(sql);

        if (rs.next()) {
            return rs.getInt("forma");
        } else {
            return 0;
        }
    }
}
